package java学习.第12章_集合框架;


import org.junit.Test;

import java.util.*;

/**
 * Collections 用来操作 Collection 和 Map 的工具类
 */
public class D_Collections {

    public static void main(String[] args) {
        Collections.synchronizedList(new ArrayList<>());//返回的就是线程安全的
        Collections.synchronizedSet(new HashSet<>());//返回的就是线程安全的
        Collections.synchronizedMap(new HashMap<>());//返回的就是线程安全的
    }

    /**
     * 排序方法
     * reverse(List)：反转 List 中元素的顺序
     * shuffle(List)：对 List 集合元素进行随机排序
     * sort(List)：根据元素的自然顺序对指定 List 集合元素按升序排序
     * sort(List，Comparator)：根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
     * swap(List，int，int)：将指定 list 集合中的 i 处元素和 j 处元素进行交换
     * <p>
     * 查找
     * Object max(Collection)：根据元素的自然顺序，返回给定集合中的最大元素
     * Object max(Collection，Comparator)：根据 Comparator 指定的顺序，返回给定集合中的最大元素
     * Object min(Collection)
     * Object min(Collection，Comparator)
     * int binarySearch(List list,T key)  二分法查找 key的坐标  list必须有序
     * int binarySearch(List list,T key,Comparator c)
     *                  根据 Comparator 指定的顺序 二分法查找 key的坐标
     * int frequency(Collection，Object)：返回指定集合中指定元素的出现次数
     * void copy(List dest,List src)：将src中的内容复制到dest中
     *                  底层： dest.set(i, src.get(i));
     * boolean replaceAll(List list，Object oldVal，Object newVal)：
     *                  使用新值替换 List 对象的所有旧值
     * Xxx unmodifiableXxx():  返回一个只能读的  Xxx类型
     *                  List   Set   Map   Collection
     */
    @Test
    public void Collections基础方法() {

        List src = new ArrayList<>();
        src.add(5465);
        src.add(45);
        src.add(5463565);
        src.add(11);
        src.add(-5465);
        List dest = new ArrayList<>();

//        if (srcSize > dest.size()) //dest的大小<list的大小
//            throw new IndexOutOfBoundsException("Source does not fit in dest");
//        java.lang.IndexOutOfBoundsException: Source does not fit in dest
        dest = Arrays.asList(new Object[src.size()]);//给dest一个大小
        Collections.copy(dest, src);//dest 的大小 必须大于等于list大小
        /**
         *     public static <T> void copy(List<? super T> dest, List<? extends T> src) {
         *         int srcSize = src.size();
         *         if (srcSize > dest.size())
         *             throw new IndexOutOfBoundsException("Source does not fit in dest");
         *
         *         if (srcSize < COPY_THRESHOLD ||
         *             (src instanceof RandomAccess && dest instanceof RandomAccess)) {
         *             for (int i=0; i<srcSize; i++)
         *                 dest.set(i, src.get(i));
         *         } else {
         *             ListIterator<? super T> di=dest.listIterator();
         *             ListIterator<? extends T> si=src.listIterator();
         *             for (int i=0; i<srcSize; i++) {
         *                 di.next();
         *                 di.set(si.next());
         *             }
         *         }
         *     }
         */
        System.out.println(dest);

    }

    @Test
    public void 扑克牌() {
        List<String> p = 牌();
        Collections.shuffle(p);
        String[] s = {"张三", "李四", "王二"};
        int k = p.size() / 3;
        for (int i = 0; i < 3; i++) {
            System.out.print(s[i] + "的牌:");
            for (int j = 0; j < k; j++) {
                System.out.print(p.get(i * k + j) + " ");
            }
            System.out.println();
        }

    }

    private static List<String> 牌() {
        List<String> l = new ArrayList<>(54);
        List<Character> list = new ArrayList<>();
        list.add('A');
        list.add('2');
        list.add('3');
        list.add('4');
        list.add('5');
        list.add('6');
        list.add('7');
        list.add('8');
        list.add('9');
        list.add('J');
        list.add('Q');
        list.add('K');
        char[] s = {'♠', '♥', '♣', '♦'};
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < s.length; j++) {
                l.add(s[j] + "" + list.get(i));
            }
        }
        l.add("小王");
        l.add("大王");
        return l;
    }

}
